Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/CommonCharts.kt 2d20cd8a4708e2ef66e98d5259f3a97ec93f240a (2d20cd8a) Text, 11.29 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tf0883e@fileTb4b4b4:Te6edf3SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)

Tff7b72package T7ee787org.meshtastic.feature.node.metrics

Tff7b72import T7ee787androidx.compose.foundation.Canvas
Tff7b72import T7ee787androidx.compose.foundation.background
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.ExperimentalLayoutApi
Tff7b72import T7ee787androidx.compose.foundation.layout.FlowRow
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.Spacer
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.layout.size
Tff7b72import T7ee787androidx.compose.foundation.layout.width
Tff7b72import T7ee787androidx.compose.foundation.shape.CircleShape
Tff7b72import T7ee787androidx.compose.foundation.shape.RoundedCornerShape
Tff7b72import T7ee787androidx.compose.material3.AlertDialog
Tff7b72import T7ee787androidx.compose.material3.FilterChip
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TextButton
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.draw.clip
Tff7b72import T7ee787androidx.compose.ui.geometry.Offset
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.graphics.StrokeCap
Tff7b72import T7ee787androidx.compose.ui.text.font.FontWeight
Tff7b72import T7ee787androidx.compose.ui.text.style.TextAlign
Tff7b72import T7ee787androidx.compose.ui.tooling.preview.PreviewLightDark
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.axis.Axis
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.axis.HorizontalAxis
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.data.CartesianValueFormatter
Tff7b72import T7ee787org.jetbrains.compose.resources.StringResource
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.common.util.DateFormatter
Tff7b72import T7ee787org.meshtastic.core.model.util.TimeConstants
Tff7b72import T7ee787org.meshtastic.core.model.util.TimeConstants.MS_PER_SEC
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.close
Tff7b72import T7ee787org.meshtastic.core.resources.info
Tff7b72import T7ee787org.meshtastic.core.resources.rssi
Tff7b72import T7ee787org.meshtastic.core.resources.snr
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Info
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.theme.AppTheme
Tff7b72import T7ee787kotlin.time.Duration.Companion.days

Tff7b72object T56d364CommonCharts Tb4b4b4{
Tff7b72const Tff7b72val Te6edf3MAX_PERCENT_VALUE Tff7b72= T79c0ff1T79c0ff0T79c0ff0f
Tff7b72const Tff7b72val Te6edf3SCROLL_BIAS Tff7b72= T79c0ff0.5f

T8b949e/**
* A dynamic [CartesianValueFormatter] that adjusts the time format based on the total data span
* ([CartesianRanges.xLength]).
*
* Since chart data is already filtered by [TimeFrame], `xLength` approximates the visible window. Vico's formatter
* receives [CartesianMeasuringContext] during measurement passes — **not** [CartesianDrawingContext] — so
* `context.zoom` is unavailable and we intentionally avoid it.
*
* | Data span | Format | Example |
* |-----------|------------------------|------------------|
* | ≤ 1 hour | Time with seconds | 3:45:12 PM |
* | ≤ 2 days | Time only | 3:45 PM |
* | ≤ 14 days | Date + time (two-line) | 4/9/26 ↵ 3:45 PM |
* | > 14 days | Date only | 4/9/26 |
*/
Tff7b72val Te6edf3dynamicTimeFormatter Tff7b72= Te6edf3CartesianValueFormatter Tb4b4b4{ Te6edf3contextTb4b4b4, Te6edf3valueTb4b4b4, Te6edf3_ Tff7b72-Tff7b72>
Tff7b72val Te6edf3timestampMillis Tff7b72= Tb4b4b4(Te6edf3value Tff7b72* Te6edf3MS_PER_SECTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3dataSpanSeconds Tff7b72= Te6edf3contextTb4b4b4.Te6edf3rangesTb4b4b4.Te6edf3xLength

Tff7b72when Tb4b4b4{
Te6edf3dataSpanSeconds Tff7b72<Tff7b72= Te6edf3TimeConstantsTb4b4b4.Te6edf3ONE_HOURTb4b4b4.Te6edf3inWholeSeconds Tff7b72-Tff7b72>
Te6edf3DateFormatterTb4b4b4.Te6edf3formatTimeWithSecondsTb4b4b4(Te6edf3timestampMillisTb4b4b4)

Te6edf3dataSpanSeconds Tff7b72<Tff7b72= T79c0ff2.Te6edf3daysTb4b4b4.Te6edf3inWholeSeconds Tff7b72-Tff7b72> Te6edf3DateFormatterTb4b4b4.Te6edf3formatTimeTb4b4b4(Te6edf3timestampMillisTb4b4b4)

Te6edf3dataSpanSeconds Tff7b72<Tff7b72= T79c0ff1T79c0ff4.Te6edf3daysTb4b4b4.Te6edf3inWholeSeconds Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3dateStr Tff7b72= Te6edf3DateFormatterTb4b4b4.Te6edf3formatDateTb4b4b4(Te6edf3timestampMillisTb4b4b4)
Tff7b72val Te6edf3timeStr Tff7b72= Te6edf3DateFormatterTb4b4b4.Te6edf3formatTimeTb4b4b4(Te6edf3timestampMillisTb4b4b4)
Ta5d6ff"Tffd700$Te6edf3dateStrTa5d6ff\Ta5d6ffnTffd700$Te6edf3timeStrTa5d6ff"
Tb4b4b4}

Tff7b72else Tff7b72-Tff7b72> Te6edf3DateFormatterTb4b4b4.Te6edf3formatDateTb4b4b4(Te6edf3timestampMillisTb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Shared bottom time axis used by all metric chart screens.
*
* Uses `spacing = 1` with `addExtremeLabelPadding = true` so Vico's built-in auto-thinning controls label density —
* it measures label widths and automatically skips labels when they would overlap, adapting to both zoom level and
* screen width.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffrememberBottomTimeAxisTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3HorizontalAxisTff7b72<Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3HorizontalTb4b4b4.Te6edf3BottomTff7b72> Tff7b72= Te6edf3HorizontalAxisTb4b4b4.Te6edf3rememberBottomTb4b4b4(
Te6edf3label Tff7b72= Te6edf3ChartStylingTb4b4b4.Te6edf3rememberAxisLabelTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3valueFormatter Tff7b72= Te6edf3dynamicTimeFormatterTb4b4b4,
Te6edf3itemPlacer Tff7b72= Te6edf3HorizontalAxisTb4b4b4.Te6edf3ItemPlacerTb4b4b4.Te6edf3alignedTb4b4b4(Te6edf3spacing Tff7b72= Tb4b4b4{ T79c0ff1 Tb4b4b4}Tb4b4b4, Te6edf3addExtremeLabelPadding Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3labelRotationDegrees Tff7b72= Te6edf3LABEL_ROTATION_DEGREESTb4b4b4,
Tb4b4b4)

Tff7b72private Tff7b72const Tff7b72val Te6edf3LABEL_ROTATION_DEGREES Tff7b72= T79c0ff4T79c0ff5f
Tb4b4b4}

Tff7b72data Tff7b72class T56d364LegendDataTb4b4b4(
Tff7b72val Te6edf3nameResTb4b4b4: Te6edf3StringResourceTb4b4b4,
Tff7b72val Te6edf3colorTb4b4b4: Te6edf3ColorTb4b4b4,
Tff7b72val Te6edf3isLineTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3metricKeyTb4b4b4: Tffa657Any? Tff7b72= Tff7b72nullTb4b4b4,
T8b949e/** When non-null, overrides the resolved [nameRes] string in the legend label. */
Tff7b72val Te6edf3labelOverrideTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)

Tff7b72data Tff7b72class T56d364InfoDialogDataTb4b4b4(Tff7b72val Te6edf3titleResTb4b4b4: Te6edf3StringResourceTb4b4b4, Tff7b72val Te6edf3definitionResTb4b4b4: Te6edf3StringResourceTb4b4b4, Tff7b72val Te6edf3colorTb4b4b4: Te6edf3ColorTb4b4b4)

T8b949e/**
* Creates the legend that identifies the colors used for the graph.
*
* When [onToggle] is provided, each item renders as a Material 3 [FilterChip] so users can tap to show/hide chart
* series. This provides proper M3 affordance (selected state styling, ripple, accessibility semantics). When [onToggle]
* is null, a compact read-only legend is shown instead.
*/
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalLayoutApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffLegendTb4b4b4(
Te6edf3legendDataTb4b4b4: Te6edf3ListTff7b72<Te6edf3LegendDataTff7b72>Tb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3hiddenSetTb4b4b4: Te6edf3SetTff7b72<Tffa657IntTff7b72> Tff7b72= Te6edf3emptySetTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3onToggleTb4b4b4: Tb4b4b4(Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3FlowRowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3vertical Tff7b72= T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3CenterTb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3legendDataTb4b4b4.Te6edf3forEachIndexed Tb4b4b4{ Te6edf3indexTb4b4b4, Te6edf3data Tff7b72-Tff7b72>
Tff7b72val Te6edf3isVisible Tff7b72= Te6edf3index Tff7b72!in Te6edf3hiddenSet
Tff7b72val Te6edf3label Tff7b72= Te6edf3dataTb4b4b4.Te6edf3labelOverride Tff7b72?: Te6edf3stringResourceTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3nameResTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3onToggle Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3FilterChipTb4b4b4(
Te6edf3selected Tff7b72= Te6edf3isVisibleTb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onToggleTb4b4b4(Te6edf3indexTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3label Tff7b72= Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3labelTb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelSmallTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3leadingIcon Tff7b72= Tb4b4b4{ Te6edf3LegendIndicatorTb4b4b4(Te6edf3color Tff7b72= Te6edf3dataTb4b4b4.Te6edf3colorTb4b4b4, Te6edf3isLine Tff7b72= Te6edf3dataTb4b4b4.Te6edf3isLineTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LegendIndicatorTb4b4b4(Te6edf3color Tff7b72= Te6edf3dataTb4b4b4.Te6edf3colorTb4b4b4, Te6edf3isLine Tff7b72= Te6edf3dataTb4b4b4.Te6edf3isLineTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3labelTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelSmallTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

T8b949e/** Displays a dialog with information about the legend items. */
Tf0883e@Composable
Tff7b72fun Td2a8ffLegendInfoDialogTb4b4b4(Te6edf3infoDataTb4b4b4: Te6edf3ListTff7b72<Te6edf3InfoDialogDataTff7b72>Tb4b4b4, Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3AlertDialogTb4b4b4(
Te6edf3icon Tff7b72= Tb4b4b4{ Te6edf3IconTb4b4b4(Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3InfoTb4b4b4, Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3title Tff7b72= Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3infoTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3headlineSmallTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3item Tff7b72in Te6edf3infoDataTb4b4b4) Tb4b4b4{
Te6edf3Column Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3MetricIndicatorTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3colorTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3titleResTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumTb4b4b4,
Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4,
Te6edf3color Tff7b72= Te6edf3itemTb4b4b4.Te6edf3colorTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3definitionResTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3onDismissRequest Tff7b72= Te6edf3onDismissTb4b4b4,
Te6edf3confirmButton Tff7b72= Tb4b4b4{
Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onDismissTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3closeTb4b4b4)Tb4b4b4, Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3shape Tff7b72= Te6edf3RoundedCornerShapeTb4b4b4(T79c0ff2T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e/** Draws a small colored line segment or circle to identify a chart series. */
Tf0883e@Composable
Tff7b72fun Td2a8ffLegendIndicatorTb4b4b4(Te6edf3colorTb4b4b4: Te6edf3ColorTb4b4b4, Te6edf3isLineTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4) Tb4b4b4{
Te6edf3CanvasTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(Te6edf3height Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4, Te6edf3width Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isLineTb4b4b4) T79c0ff1T79c0ff6.Te6edf3dp Tff7b72else T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isLineTb4b4b4) Tb4b4b4{
Te6edf3drawLineTb4b4b4(
Te6edf3color Tff7b72= Te6edf3colorTb4b4b4,
Te6edf3start Tff7b72= Te6edf3OffsetTb4b4b4(Te6edf3x Tff7b72= T79c0ff0fTb4b4b4, Te6edf3y Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3height Tff7b72/ T79c0ff2fTb4b4b4)Tb4b4b4,
Te6edf3end Tff7b72= Te6edf3OffsetTb4b4b4(Te6edf3x Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3widthTb4b4b4, Te6edf3y Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3height Tff7b72/ T79c0ff2fTb4b4b4)Tb4b4b4,
Te6edf3strokeWidth Tff7b72= T79c0ff2.Te6edf3dpTb4b4b4.Te6edf3toPxTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3cap Tff7b72= Te6edf3StrokeCapTb4b4b4.Te6edf3RoundTb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3drawCircleTb4b4b4(Te6edf3color Tff7b72= Te6edf3colorTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72fun Td2a8ffMetricIndicatorTb4b4b4(Te6edf3colorTb4b4b4: Te6edf3ColorTb4b4b4, Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4) Tb4b4b4{
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4.Te6edf3clipTb4b4b4(Te6edf3CircleShapeTb4b4b4)Tb4b4b4.Te6edf3backgroundTb4b4b4(Te6edf3colorTb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72fun Td2a8ffLegendPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3data Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3LegendDataTb4b4b4(Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rssiTb4b4b4, Te6edf3color Tff7b72= Te6edf3ColorTb4b4b4.Te6edf3RedTb4b4b4, Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3LegendDataTb4b4b4(Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3snrTb4b4b4, Te6edf3color Tff7b72= Te6edf3ColorTb4b4b4.Te6edf3GreenTb4b4b4, Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3AppTheme Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// Read-only legend
Te6edf3LegendTb4b4b4(Te6edf3legendData Tff7b72= Te6edf3dataTb4b4b4)
T8b949e// Toggleable legend
Te6edf3LegendTb4b4b4(Te6edf3legendData Tff7b72= Te6edf3dataTb4b4b4, Te6edf3hiddenSet Tff7b72= Te6edf3setOfTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4, Te6edf3onToggle Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.07s